﻿/***
  \brief  КЛассы для словаря
*/


#pragma once


#include "core_api.h"
#include "common_types.h"
 
#include <string>
#include <vector>
#include <algorithm>
#include "error.h"


//!  \brief строка для словаря
class  CORE_API dictLine
{
public:
	enum
	{
		MAX_WORD_LEN =256
	};

	char buf[MAX_WORD_LEN];

	dictLine()
	{
		buf[0] = '\0';
	}

	dictLine(const char* line) throw(Error)
	{
		*this = line;
	}

	dictLine(const dictLine& a) throw(Error)
	{
		*this = a.c_str();
	}

	const char* c_str() const 
	{
		return buf;
	}

	bool empty() const
	{
		return buf[0] == '\0';
	}

	void operator = (const char* line) throw(Error);

	bool operator == (const char* a) const  throw(Error);

	bool operator < (const dictLine& a) const;

};

//--------------------------------------------------------------------------

//! \brief слово словаря.
class  CORE_API dictionaryWord
{
	public:

		enum 
		{
			//! Сколько есть у слова вариантов русского перевода
			MAX_RUS_VARIANTS = 8
		};

		int reserved;

		dictLine english_word;
		dictLine russians [MAX_RUS_VARIANTS];

		dictionaryWord(const std::string& line) throw(Error);

		void readFromLine(const std::string& line)  throw(Error);
		void writeToLine(std::string& dest) const;



};

//-----------------------------------------------------------------------------
 
//! \brief   Словарь. 
class  CORE_API Dictionary
{
	private:
		std::wstring  m_fullPath;
		PtrAuto<  std::vector<dictionaryWord>  > m_dictWords;

		void SortWords();

	public:

		 Dictionary(const std::wstring& fullpath) throw (Error);
		~Dictionary()
		{
			Save();
		}

		//!  \brief ПОиск индекса слова по его англ. названию. Если не найдено, то вернёт (-1)
		size_t searchWordIndex(const char* eng) const;

		//!  \brief Получить кол-во слов в словаре
		int GetNumWords() const 
		{
			return (int)m_dictWords->size();
		}

		//!   \brief Получить инф. слова (перевод) по названию (англоязычному). Вернёт flase если слова такого нет.
		bool GetWorldInfoWord (char* dest_rus, const char* engWord);
		//!  \brief  ПОлучить инф. слова (перевод) по его номеру. Вернёт flase если слова такого нет.
		bool GetWorldInfoIndex(char* dest_eng, char* dest_rus, const int engWordIndex);
		//!  \brief Добавить новое слово в словарь. Вернёт false если слово уже есть
		bool AddNewWord(const char* eng, const char* rus_line);

		bool ModifyWordIndex( const char* rus, const int engWordindex );

		bool DeleteWordIndex( const int engWordIndex);


		//

		void Save();


};

   


// end file